<template>
  <transition name="down"  @after-leave="destroy">
    <div
        v-show="isVisable"
        class="min-w-[420px] fixed top-[20px] left-[50%] translate-x-[-50%] z-50 flex items-center px-3 py-1.5
              rounded-sm border cursor-pointer" :class="styles[type].containerClass">
      <mine-svg-icon :name="styles[type].icon"
                     :fillClass="styles[type].fillClass"
                     class="h-1.5 w-1.5 mr-1.5">
      </mine-svg-icon>
      <span class="text-sm" :class="styles[type].textClass">{{ content }}</span>
    </div>
  </transition>
</template>

<script>
const SUCCESS = 'success'
const WARN = 'warn'
const ERROR = 'error'
const typeEnum = [SUCCESS, WARN, ERROR]
</script>
<script setup>
import MineSvgIcon from '../svg-icon/index.vue'
import {onMounted, ref} from "vue";

const props = defineProps({
  /**
   * 消息类型
   */
  type: {
    type: String,
    required: true,
    validator(val) {
      const result = typeEnum.includes(val)
      if (!result) {
        throw new Error(`你的type必须是${typeEnum.join('、')}中的一个`)
      }
      return result
    }
  },
  /**
   * 消息文本
   */
  content: {
    type: String,
    required: true
  },
  /**
   * 展示时长
   */
  duration: {
    type: Number
  },
  /**
   * 关闭的回调
   */
  destroy: {
    type: Function
  }
})
/**
 * 样式数据
 * @type {{}}
 */
const styles = {
  //警告
  warn: {
    icon: 'warn',
    fillClass: 'fill-warn-300',
    textClass: 'text-warn-300',
    containerClass: 'bg-warn-100 border-warn-200 hover:shadow-lg hover:shadow-warn-100'
  },
  //成功
  success: {
    icon: 'success',
    fillClass: 'fill-success-300',
    textClass: 'text-success-300',
    containerClass: 'bg-success-100 border-success-200 hover:shadow-lg hover:shadow-success-100'
  },
  //错误
  error: {
    icon: 'error',
    fillClass: 'fill-error-300',
    textClass: 'text-error-300',
    containerClass: 'bg-error-100 border-error-200 hover:shadow-lg hover:shadow-error-100'
  }
}
/**
 * 控制展示
 */
const isVisable = ref(false)
/**
 * 动画时长
 * @type {string}
 */
const animDuration = '0.5s'
/**
 * 保证动画展示
 */
onMounted(() => {
  isVisable.value = true
  setTimeout(() => {
    isVisable.value = false
    // setTimeout(() => {
    //   if (props.destory) {
    //     props.destory()
    //   }
    // }, parseInt(duration.replace('0.', '').replace('s', '')) * 100)
  }, props.duration)
})
</script>
<style lang="scss" scoped>
.down-enter-active, .down-leave-active {
  transition: all v-bind(animDuration);
}

.down-enter-from, .down-leave-to {
  opacity: 0;
  transform: translate3d(-50%, -100px, 0);
}
</style>
